package br.com.virtual.replicar.model;
 
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.validation.constraints.Min;

@Entity
@Table(name = "produto")
public class ProdutoSinc extends VirtualModelReplicacao implements Comparable<ProdutoSinc> {

	private static final long serialVersionUID = 1L;


	@Id
	private Long id;

	@ManyToOne
	private CategoriaSinc categoria;

	private String nome;
	
	@Column(columnDefinition = "text")
	private String especificacoes;
	
	@Min(value = 0, message = "Peso: Deve ser um número maior ou igual à 0(Zero).")
	private float peso;
	
	private String dimensoes;
	
	@Column(name="altura_embalagem") @Min(value = 0, message = "Altura da Embalagem: Deve ser um número maior que 0(Zero).")
	private Float alturaEmbalagem;
	
	@Column(name="comprimento_embalagem") @Min(value = 0, message = "Comprimento da Embalagem: Deve ser um número maior que 0(Zero).")
	private Float comprimentoEmbalagem;
	
	@Column(name="largura_embalagem") @Min(value = 0, message = "Largura da Embalagem: Deve ser um número maior que 0(Zero).")
	private Float larguraEmbalagem;
	
	@Min(value = 0, message = "Quantidade: Deve ser um número maior ou igual à 0(Zero).")
	private Integer quantidade;
	
	@Min(value = 0, message = "Preço de Custo: Deve ser um número maior ou igual à 0(Zero).")
	private Double preco_custo;
	
	@Min(value = 0, message = "Preço de Venda: Deve ser um número maior ou igual à 0(Zero).")
	private Double preco_venda;
	
	private Double preco_venda_desconto;
	
	private String fabricante;

	private String modelo;
	
	private String link;
	
	private String garantia;
	
	private Integer ordem;

	private Integer numero_parcelas;
	
	private Double percentual_desconto;

	private boolean destaque = false;
	
	private boolean banner = false;
	
	private boolean newsLetter = false;
	
	private boolean ativo = true;

	@OneToMany(mappedBy = "produto", fetch = FetchType.LAZY, cascade = CascadeType.REFRESH)
	private List<FotoSinc> fotos;

	public ProdutoSinc() {
		super();
	}

	public ProdutoSinc(Long id, String nome, String fabricante, String modelo,
			Double preco_venda, Double preco_venda_desconto, CategoriaSinc categoria) {

		setId(id);
		setNome(nome);
		setFabricante(fabricante);
		setModelo(modelo);
		setPreco_venda(preco_venda);
		setPreco_venda_desconto(preco_venda_desconto);
		setCategoria(categoria);

	}

	public ProdutoSinc(Long id, CategoriaSinc categoria, String nome,
			String especificacoes, float peso, String dimensoes,
			int quantidade, double preco_custo, double preco_venda,
			String fabricante, String modelo, String link, String garantia,
			int numero_parcelas, double percentual_desconto, boolean destaque,
			boolean ativo, double total_item, int quantidade_item) {
		super();
		this.id = id;
		this.categoria = categoria;
		this.nome = nome;
		this.especificacoes = especificacoes;
		this.peso = peso;
		this.dimensoes = dimensoes;
		this.quantidade = quantidade;
		this.preco_custo = preco_custo;
		this.preco_venda = preco_venda;
		this.fabricante = fabricante;
		this.modelo = modelo;
		this.link = link;
		this.garantia = garantia;
		this.numero_parcelas = numero_parcelas;
		this.percentual_desconto = percentual_desconto;
		this.destaque = destaque;
		this.ativo = ativo;
	}

	
	public ProdutoSinc(Long idEntidade) {

		setId(idEntidade);
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public CategoriaSinc getCategoria() {
		return categoria;
	}

	public void setCategoria(CategoriaSinc categoria) {
		this.categoria = categoria;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getEspecificacoes() {
		return especificacoes;
	}

	public void setEspecificacoes(String especificacoes) {
		this.especificacoes = especificacoes;
	}

	public float getPeso() {
		return peso;
	}

	public void setPeso(float peso) {
		this.peso = peso;
	}

	public String getDimensoes() {
		return dimensoes;
	}

	public void setDimensoes(String dimensoes) {
		this.dimensoes = dimensoes;
	}

	public int getQuantidade() {
		return quantidade;
	}

	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}

	public double getPreco_custo() {
		return preco_custo;
	}

	public void setPreco_custo(double preco_custo) {
		this.preco_custo = preco_custo;
	}

	public double getPreco_venda() {
		return preco_venda;
	}

	public void setPreco_venda(double preco_venda) {
		this.preco_venda = preco_venda;
	}

	public String getFabricante() {
		return fabricante;
	}

	public void setFabricante(String fabricante) {
		this.fabricante = fabricante;
	}

	public String getModelo() {
		return modelo;
	}

	public void setModelo(String modelo) {
		this.modelo = modelo;
	}

	public String getLink() {
		return link;
	}

	public void setLink(String link) {
		this.link = link;
	}

	public String getGarantia() {
		return garantia;
	}

	public void setGarantia(String garantia) {
		this.garantia = garantia;
	}

	public boolean isDestaque() {
		return destaque;
	}

	public void setDestaque(boolean destaque) {
		this.destaque = destaque;
	}

	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public int getNumero_parcelas() {
		return numero_parcelas;
	}

	public void setNumero_parcelas(int numero_parcelas) {
		this.numero_parcelas = numero_parcelas;
	}

	public double getPercentual_desconto() {
		return percentual_desconto;
	}

	public void setPercentual_desconto(double percentual_desconto) {
		this.percentual_desconto = percentual_desconto;
	}

	public boolean isBanner() {
		return banner;
	}

	public void setBanner(boolean banner) {
		this.banner = banner;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ProdutoSinc other = (ProdutoSinc) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Produto [id=" + id + ", categoria=" + categoria + ", nome="
				+ nome + ", especificacoes=" + especificacoes + ", peso="
				+ peso + ", dimensoes=" + dimensoes + ", quantidade="
				+ quantidade + ", preco_custo=" + preco_custo
				+ ", preco_venda=" + preco_venda + ", fabricante=" + fabricante
				+ ", modelo=" + modelo + ", link=" + link + ", garantia="
				+ garantia + ", numero_parcelas=" + numero_parcelas
				+ ", percentual_desconto=" + percentual_desconto
				+ ", destaque=" + destaque + ", ativo=" + ativo + "]";
	}

	@Override
	public int compareTo(ProdutoSinc o) {
		return this.nome.trim().toUpperCase()
				.compareTo(o.getNome().trim().toUpperCase());
	}

	@Override
	public ProdutoSinc clone() {
		try {
			return (ProdutoSinc) super.clone();
		} catch (CloneNotSupportedException e) {
			System.out.println("Falha ao clonar");
			return null;
		}
	}

	public List<FotoSinc> getFotos() {
		return fotos;
	}

	public void setFotos(List<FotoSinc> fotos) {
		this.fotos = fotos;
	}

	public int getOrdem() {
		return ordem;
	}

	public void setOrdem(int ordem) {
		this.ordem = ordem;
	}

	public double getPreco_venda_desconto() {
		return preco_venda_desconto;
	}

	public void setPreco_venda_desconto(double preco_venda_desconto) {
		this.preco_venda_desconto = preco_venda_desconto;
	}

	public boolean isNewsLetter() {
		return newsLetter;
	}

	public void setNewsLetter(boolean newsLetter) {
		this.newsLetter = newsLetter;
	}

}
